{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b77b4fa6",
   "metadata": {},
   "outputs": [],
   "source": [
    "from openai import OpenAI"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e06c2bdd",
   "metadata": {},
   "outputs": [],
   "source": [
    "api_key=\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\n",
    "base_url=\"https://openai.zhixueyouke.cn/v1/\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "294d9aca",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "\t\"input\": [5, 8, 11, 13],\n",
      "\t\"solution\": \"(13 - 11) * (5 + 8) = 24\"\n",
      "}\n"
     ]
    }
   ],
   "source": [
    "client = OpenAI(api_key=api_key, base_url=base_url)\n",
    "# 1、示例与格式\n",
    "instruction = \"使用数字和基本算术运算（+-*/）得到24。\"\n",
    "\n",
    "# 2、使用案例\n",
    "examples = \"\"\"\n",
    "Input: 4 4 6 8\n",
    "Answer: (4 + 8) * (6 - 4) = 24\n",
    "Input: 2 9 10 12\n",
    "Answer: 2 * 12 * (10 - 9) = 24\n",
    "Input: 4 9 10 13\n",
    "Answer: (13 - 9) * (10 - 4) = 24\n",
    "Input: 1 4 8 8\n",
    "Answer: (8 / 4 + 1) * 8 = 24\n",
    "Input: 5 5 5 9\n",
    "Answer: 5 + 5 + 5 + 9 = 24\n",
    "\"\"\"\n",
    "\n",
    "# 3、用户输入\n",
    "input_text = \"5 8 11 13\"\n",
    "input_text = input_text + \"，让我们逐步思考\"\n",
    "\n",
    "# 4、输出格式\n",
    "output = \"将提取的信息以JSON格式展示\"\n",
    "\n",
    "prompt = f\"\"\"\n",
    "{instruction}\n",
    "\n",
    "{examples}\n",
    "\n",
    "给定的文本内容：\n",
    "{input_text}\n",
    "\n",
    "{output}\n",
    "\"\"\"\n",
    "\n",
    "def get_completion(prompt_content, model_name = 'gpt-3.5-turbo'):\n",
    "    messages = [{\"role\": \"user\", \"content\": prompt_content}]\n",
    "    # 调用OpenAI的接口\n",
    "    response = client.chat.completions.create(\n",
    "        model=model_name,\n",
    "        messages=messages\n",
    "    )\n",
    "    return response.choices[0].message.content\n",
    "\n",
    "print(get_completion(prompt))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c405bdb2-e14b-4e98-a85f-4ff6474f2da3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "26\n"
     ]
    }
   ],
   "source": [
    "a = (13 - 11) * (5 + 8)\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a86e3366",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"\\n思路:\\n    如果让我们编写一个24点的游戏,那么我们应该要如何来进行实现呢?\\n        1. 了解24点游戏的规则\\n            比如说: 有四个数字 => 2 8 8 14\\n            那么我们需要对这4个数字其中的连个进行数学的四则基本运算(加减乘除) => 得到三个数字\\n            再将其中的三个数字进行数学的四则运算,得到2个数字\\n            在将其中的两个数字进行数学的四则基本运算,得到一个个数字\\n                如果说这个一个数字的结果是24点,那么这四个数字就可以完成24点游戏\\n        2. 当我们知道了这个规则之后,我们需要进行编写prompt,目的 => 就是为了让AI大模型熟悉的24点规则\\n            propose_prompt = '''\\n                输入: 2 8 8 14\\n                    可能进行的下一步行动:\\n                    2 + 8 = 10 (left: 8 10 14)\\n                    8 / 2 = 4 (left: 4 8 14)\\n                    8 - 2 = 6 (left: 6 8 14)\\n                    14 / 2 = 7 (left: 7 8 8)\\n                    ... ...\\n                输入: 9 11 13 15\\n                    可能进行的下一步行动:\\n            '''\\n        3. 我们需要对三个数字的值进行评估,评估是否有可能达到24点\\n            如果说: 评估出来的结果,能够达到24点,那么我们就给他一个评估分数 => 20 分\\n            如果说: 评估出来的结果,不能够达到24点,但是有可能达到24点,那么我们也给他一个评估分数 => 1 分\\n            如果说: 评估出来的结果,不能够达到24点,那么我们也给他一个评估分数 => 0.1 分\\n实现:\\n    1. 我们需要有一个和GPT交互的函数\\n    2. 我们有四个数字,编写成三个数字,将三个数字编写二个数字,将二个数字编写成一个数字,分别:\\n        A. 第一轮:\\n            ① 将四个数字变成三个数字\\n            ② 进行评估,评估他们是否有可能达到24点,并且给一个评估的分数\\n            ③ 候选,根据评分,筛选出来评分最高的5个操作\\n                对这个分时进行评估,排序,筛选,分数高的在前面,分数低的在后面,将分数低的直接过滤掉\\n                    原因: 节约token,节约时间\\n        B. 第二轮:\\n            ① 思考: 将三个数字变成二个数字\\n            ② 评估...\\n            ③ 候选...\\n        C. 第三轮:\\n            ① 计算\\n            ② 筛选\\n            ③ 得到最终的结果 => 是否能够达到24点\\n\""
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"\"\"\n",
    "思路:\n",
    "    如果让我们编写一个24点的游戏,那么我们应该要如何来进行实现呢?\n",
    "        1. 了解24点游戏的规则\n",
    "            比如说: 有四个数字 => 2 8 8 14\n",
    "            那么我们需要对这4个数字其中的连个进行数学的四则基本运算(加减乘除) => 得到三个数字\n",
    "            再将其中的三个数字进行数学的四则运算,得到2个数字\n",
    "            在将其中的两个数字进行数学的四则基本运算,得到一个个数字\n",
    "                如果说这个一个数字的结果是24点,那么这四个数字就可以完成24点游戏\n",
    "        2. 当我们知道了这个规则之后,我们需要进行编写prompt,目的 => 就是为了让AI大模型熟悉的24点规则\n",
    "            propose_prompt = '''\n",
    "                输入: 2 8 8 14\n",
    "                    可能进行的下一步行动:\n",
    "                    2 + 8 = 10 (left: 8 10 14)\n",
    "                    8 / 2 = 4 (left: 4 8 14)\n",
    "                    8 - 2 = 6 (left: 6 8 14)\n",
    "                    14 / 2 = 7 (left: 7 8 8)\n",
    "                    ... ...\n",
    "                输入: 9 11 13 15\n",
    "                    可能进行的下一步行动:\n",
    "            '''\n",
    "        3. 我们需要对三个数字的值进行评估,评估是否有可能达到24点\n",
    "            如果说: 评估出来的结果,能够达到24点,那么我们就给他一个评估分数 => 20 分\n",
    "            如果说: 评估出来的结果,不能够达到24点,但是有可能达到24点,那么我们也给他一个评估分数 => 1 分\n",
    "            如果说: 评估出来的结果,不能够达到24点,那么我们也给他一个评估分数 => 0.1 分\n",
    "实现:\n",
    "    1. 我们需要有一个和GPT交互的函数\n",
    "    2. 我们有四个数字,编写成三个数字,将三个数字编写二个数字,将二个数字编写成一个数字,分别:\n",
    "        A. 第一轮:\n",
    "            ① 将四个数字变成三个数字\n",
    "            ② 进行评估,评估他们是否有可能达到24点,并且给一个评估的分数\n",
    "            ③ 候选,根据评分,筛选出来评分最高的5个操作\n",
    "                对这个分时进行评估,排序,筛选,分数高的在前面,分数低的在后面,将分数低的直接过滤掉\n",
    "                    原因: 节约token,节约时间\n",
    "        B. 第二轮:\n",
    "            ① 思考: 将三个数字变成二个数字\n",
    "            ② 评估...\n",
    "            ③ 候选...\n",
    "        C. 第三轮:\n",
    "            ① 计算\n",
    "            ② 筛选\n",
    "            ③ 得到最终的结果 => 是否能够达到24点\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "07cccf04",
   "metadata": {},
   "outputs": [],
   "source": [
    "propose_prompt = \"\"\"\n",
    "输入: 2 8 8 14\n",
    "可能的下一步行动：\n",
    "2 + 8 = 10 (left: 8 10 14)\n",
    "8 / 2 = 4 (left: 4 8 14)\n",
    "14 + 2 = 16 (left: 8 8 16)\n",
    "2 * 8 = 16 (left: 8 14 16)\n",
    "8 - 2 = 6 (left: 6 8 14)\n",
    "14 - 8 = 6 (left: 2 6 8)\n",
    "14 /  2 = 7 (left: 7 8 8)\n",
    "14 - 2 = 12 (left: 8 8 12)\n",
    "输入: {input}\n",
    "可能的下一步行动：\n",
    "\"\"\"\n",
    "\n",
    "value_prompt = \"\"\"\n",
    "评估给定的数字是否可以达到24，输出sure(20)/likely(1)/impossible(0.001)，只输出分值\n",
    "10 14\n",
    "10 + 14 = 24\n",
    "left: 20\n",
    "11 12\n",
    "11 + 12 = 23\n",
    "12 - 11 = 1\n",
    "11 * 12 = 132\n",
    "11 / 12 = 0.91\n",
    "left: 0.001\n",
    "4 4 10\n",
    "4 + 4 + 10 = 8 + 10 = 18\n",
    "4 * 10 - 4 = 40 - 4 = 36\n",
    "(10 - 4) * 4 = 6 * 4 = 24\n",
    "left: 20\n",
    "4 9 11\n",
    "9 + 11 + 4 = 20 + 4 = 24\n",
    "left: 20\n",
    "5 7 8\n",
    "5 + 7 + 8 = 12 + 8 = 20\n",
    "(8 - 5) * 7 = 3 * 7 = 21\n",
    "无法达到24, 但数字在合理范围内\n",
    "left: 1\n",
    "5 6 6\n",
    "5 + 6 + 6 = 17\n",
    "(6 - 5) * 6 = 1 * 6 = 6\n",
    "无法达到24, 但数字在合理范围内\n",
    "left: 1\n",
    "10 10 11\n",
    "10 + 10 + 11 = 31\n",
    "(11 - 10) * 10 = 10\n",
    "10 10 10 太大了\n",
    "left: 0.001\n",
    "1 3 3\n",
    "1 * 3 * 3 = 9\n",
    "(1 + 3) * 3 = 12\n",
    "1 3 3 太小了\n",
    "left: 0.001\n",
    "{input}\n",
    "\"\"\""
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
